package ma.ensao.evalmetrics.controller;

import java.util.Iterator;
import java.util.List;

import ma.ensao.evalmetrics.model.ResultClasse;
import ma.ensao.evalmetrics.model.ResultMethod;
import ma.ensao.evalmetrics.util.HibernateUtil;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.classic.Session;

public class ClasseManager extends HibernateUtil {
	
	public int countTotal(Long id){
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		int count = ((Long)session.createQuery("select count(*) from ResultClasse where idProjet="+id).uniqueResult()).intValue();
		session.getTransaction().commit();
		return count;
	}

	/******** methode pour avoir le idtest max pour un projet ********/
	public int testId(Long id) {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		int idtest = 0;
		try {
			Query query = session
					.createQuery("from ResultClasse where idProjet="
							+ id
							+ " AND  idtest IN (SELECT MAX( idtest ) from ResultClasse  where idProjet="
							+ id + " )");
			Iterator resultClasse = query.iterate();

			if (resultClasse.hasNext()) {
				ResultClasse c = (ResultClasse) resultClasse.next();
				// System.out.println("nom = " + c.getIdtest());
				idtest = c.getIdtest();
				
			}

		} catch (HibernateException e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}
		session.getTransaction().commit();
		return idtest;

	}

	/******** methode insertion dans la base de donnée ********/
	public ResultClasse addClass(ResultClasse classe) {
		int lastid = testId(classe.getIdProjet());
		classe.setIdtest(lastid);	
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		session.save(classe);
		
		session.getTransaction().commit();
		return classe;
	}
	
	public void addAll(List<ResultClasse> classe) {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		for ( int i=0; i<classe.size(); i++ ) {
			
		session.save(classe.get(i));
		}
		session.getTransaction().commit();
		
	}
	/******** methode pour modifier un record ********/
	public ResultClasse updateClass(ResultClasse classe) {
	
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		session.update(classe);
		
		session.getTransaction().commit();
		return classe;
	}
	/******** methode pour supprimer un record ********/
	public void deleteClass(ResultClasse classe) {
		
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		session.delete(classe);
		session.getTransaction().commit();
		
	}

	/******** methode pour selectioner une liste de la base de donnée ********/
	public List<ResultClasse> listAll(Long id,int startIndex, int pageSize,String jtSorting) {
	
	Session session = HibernateUtil.getSessionFactory().getCurrentSession();
	session.beginTransaction();
	List<ResultClasse> classes = null;
	try {
		Query q = session.createQuery("from ResultClasse where idProjet="+id+" ORDER BY "+jtSorting+" ");
		q.setFirstResult(startIndex);
		q.setMaxResults(pageSize);
		classes = (List<ResultClasse>)q.list();
		
	} catch (HibernateException e) {
		e.printStackTrace();
		session.getTransaction().rollback();
	}
	session.getTransaction().commit();
	return classes;
}
	
	public List<ResultClasse> list(Long id,int startIndex, int pageSize,String jtSorting) {
		
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<ResultClasse> classes = null;
		try {
			Query q = session.createQuery("from ResultClasse where idProjet="+id+" AND idtest IN (SELECT MAX( idtest ) FROM ResultClasse  where idProjet="+id+" ) ORDER BY "+jtSorting+" ");
			q.setFirstResult(startIndex);
			q.setMaxResults(pageSize);
			classes = (List<ResultClasse>)q.list();
			
		} catch (HibernateException e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}
		session.getTransaction().commit();
		return classes;
	}
	/******** methode pour selectioner dernier ajout  ********/
	public ResultClasse LastTest(Long id) {

		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();

		ResultClasse resultClasse = (ResultClasse) session
				.createQuery(
						"from ResultClasse where idProjet="
								+ id
								+ " AND idtest IN (SELECT max(idtest) FROM ResultClasse where idProjet="
								+ id + ")").uniqueResult();

		session.getTransaction().commit();

		return resultClasse;

	}

	public static void main(String[] args) {

		ClasseManager q = new ClasseManager();
		int a = 0;
		a = q.testId(2L);
		System.out.println("the last idtest " + a);
	}

}
